<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Important Configuration Changes | Elasticsearch: The Definitive Guide [2.x] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch: The Definitive Guide [2.x]">
<link rel="up" href="deploy.html" title="Production Deployment">
<link rel="prev" href="_configuration_management.html" title="Configuration Management">
<link rel="next" href="_don_8217_t_touch_these_settings.html" title="Don’t Touch These Settings!">
<meta name="DC.type" content="Learn/Docs/Legacy/Elasticsearch/Definitive Guide/2.x">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="2.x">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<p>
  <strong>WARNING</strong>: The 2.x versions of Elasticsearch have passed their
  <a href="https://www.elastic.co/support/eol">EOL dates</a>. If you are running
  a 2.x version, we strongly advise you to upgrade.
</p>
<p>
  This documentation is no longer maintained and may be removed. For the latest
  information, see the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html">current
  Elasticsearch documentation</a>.
</p>
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: The Definitive Guide [2.x]</a></span>
»
<span class="breadcrumb-link"><a href="administration.html">Administration, Monitoring, and Deployment</a></span>
»
<span class="breadcrumb-link"><a href="deploy.html">Production Deployment</a></span>
»
<span class="breadcrumb-node">Important Configuration Changes</span>
</div>
<div class="navheader">
<span class="prev">
<a href="_configuration_management.html">« Configuration Management</a>
</span>
<span class="next">
<a href="_don_8217_t_touch_these_settings.html">Don’t Touch These Settings! »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="important-configuration-changes"></a>Important Configuration Changes<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/510_Deployment/40_config.asciidoc">edit</a>
</h2>
</div></div></div>
<p>Elasticsearch ships with <em>very good</em> defaults, especially when it comes to performance-
related settings and options.  When in doubt, just leave
the settings alone.  We have witnessed countless dozens of clusters ruined
by errant settings because the administrator thought he could turn a knob
and gain 100-fold improvement.</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>Please read this entire section!  All configurations presented are equally
important, and are not listed in any particular order.  Please read
through all configuration options and apply them to your cluster.</p>
</div>
</div>
<p>Other databases may require tuning, but by and large, Elasticsearch does not.
If you are hitting performance problems, the solution is usually better data
layout or more nodes.  There are very few "magic knobs" in Elasticsearch.
If there were, we’d have turned them already!</p>
<p>With that said, there are some <em>logistical</em> configurations that should be changed
for production.  These changes are necessary either to make your life easier, or because
there is no way to set a good default (because it depends on your cluster layout).</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_assign_names"></a>Assign Names<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/510_Deployment/40_config.asciidoc">edit</a>
</h3>
</div></div></div>
<p>Elasticseach by default starts a cluster named <code class="literal">elasticsearch</code>.  It is wise
to rename your production cluster to something else, simply to prevent accidents
whereby someone’s laptop joins the cluster.  A simple change to <code class="literal">elasticsearch_production</code>
can save a lot of heartache.</p>
<p>This can be changed in your <code class="literal">elasticsearch.yml</code> file:</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">cluster.name: elasticsearch_production</pre>
</div>
<p>Similarly, it is wise to change the names of your nodes. As you’ve probably
noticed by now, Elasticsearch assigns a random Marvel superhero name
to your nodes at startup.  This is cute in development—​but less cute when it is
3a.m. and you are trying to remember which physical machine was Tagak the Leopard Lord.</p>
<p>More important, since these names are generated on startup, each time you
restart your node, it will get a new name. This can make logs confusing,
since the names of all the nodes are constantly changing.</p>
<p>Boring as it might be, we recommend you give each node a name that makes sense
to you—​a plain, descriptive name.  This is also configured in your <code class="literal">elasticsearch.yml</code>:</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">node.name: elasticsearch_005_data</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_paths"></a>Paths<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/510_Deployment/40_config.asciidoc">edit</a>
</h3>
</div></div></div>
<p>By default, Elasticsearch will place the plug-ins,
 logs, and—​most important—​your data in the installation directory.  This can lead to
unfortunate accidents, whereby the installation directory is accidentally overwritten
by a new installation of Elasticsearch. If you aren’t careful, you can erase all your data.</p>
<p>Don’t laugh—​we’ve seen it happen more than a few times.</p>
<p>The best thing to do is relocate your data directory outside the installation
location.  You can optionally move your plug-in and log directories as well.</p>
<p>This can be changed as follows:</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">path.data: /path/to/data1,/path/to/data2 <a id="CO301-1"></a><i class="conum" data-value="1"></i>

# Path to log files:
path.logs: /path/to/logs

# Path to where plugins are installed:
path.plugins: /path/to/plugins</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO301-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>Notice that you can specify more than one directory for data by using comma-separated lists.</p>
</td>
</tr>
</table>
</div>
<p>Data can be saved to multiple directories, and if each directory
is mounted on a different hard drive, this is a simple and effective way to
set up a software RAID 0.  Elasticsearch will automatically stripe
data between the different directories, boosting performance.</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<h3>Multiple data path safety and performance</h3>
<p>Like any RAID 0 configuration, only a single copy of your data is saved to the
hard drives.  If you lose a hard drive, you are <em>guaranteed</em> to lose a portion
of your data on that machine.  With luck you’ll have replicas elsewhere in the
cluster which can recover the data, and/or a recent <a class="xref" href="backing-up-your-cluster.html" title="Backing Up Your Cluster">backup</a>.</p>
<p>Elasticsearch attempts to minimize the extent of data loss by striping entire
shards to a drive.  That means that <code class="literal">Shard 0</code> will be placed entirely on a single
drive. Elasticsearch will not stripe a shard across multiple drives, since the
loss of one drive would corrupt the entire shard.</p>
<p>This has ramifications for performance: if you are adding multiple drives
to improve the performance of a single index, it is unlikely to help since
most nodes will only have one shard, and thus one active drive.  Multiple data
paths only helps if you have many indices/shards on a single node.</p>
<p>Multiple data paths is a nice convenience feature, but at the end of the day,
Elasticsearch is not a software RAID package. If you need more advanced configuration,
robustness and flexibility, we encourage you to use actual software RAID packages
instead of the multiple data path feature.</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_minimum_master_nodes"></a>Minimum Master Nodes<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/510_Deployment/40_config.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">minimum_master_nodes</code> setting is <em>extremely</em> important to the
stability of your cluster.  This setting helps prevent <em>split brains</em>, the existence of two masters in a single cluster.</p>
<p>When you have a split brain, your cluster is at danger of losing data.  Because
the master is considered the supreme ruler of the cluster, it decides
when new indices can be created, how shards are moved, and so forth.  If you have <em>two</em>
masters, data integrity becomes perilous, since you have two nodes
that think they are in charge.</p>
<p>This setting tells Elasticsearch to not elect a master unless there are enough
master-eligible nodes available.  Only then will an election take place.</p>
<p>This setting should always be configured to a quorum (majority) of your master-eligible nodes.  A quorum is <code class="literal">(number of master-eligible nodes / 2) + 1</code>.
Here are some examples:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
If you have ten regular nodes (can hold data, can become master), a quorum is
<code class="literal">6</code>.
</li>
<li class="listitem">
If you have three dedicated master nodes and a hundred data nodes, the quorum is <code class="literal">2</code>,
since you need to count only nodes that are master eligible.
</li>
<li class="listitem">
If you have two regular nodes, you are in a conundrum.  A quorum would be
<code class="literal">2</code>, but this means a loss of one node will make your cluster inoperable.  A
setting of <code class="literal">1</code> will allow your cluster to function, but doesn’t protect against
split brain.  It is best to have a minimum of three nodes in situations like this.
</li>
</ul>
</div>
<p>This setting can be configured in your <code class="literal">elasticsearch.yml</code> file:</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">discovery.zen.minimum_master_nodes: 2</pre>
</div>
<p>But because Elasticsearch clusters are dynamic, you could easily add or remove
nodes that will change the quorum.  It would be extremely irritating if you had
to push new configurations to each node and restart your whole cluster just to
change the setting.</p>
<p>For this reason, <code class="literal">minimum_master_nodes</code> (and other settings) can be configured
via a dynamic API call.  You can change the setting while your cluster is online:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT /_cluster/settings
{
    "persistent" : {
        "discovery.zen.minimum_master_nodes" : 2
    }
}</pre>
</div>
<p>This will become a persistent setting that takes precedence over whatever is
in the static configuration.  You should modify this setting whenever you add or
remove master-eligible nodes.</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_recovery_settings"></a>Recovery Settings<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/510_Deployment/40_config.asciidoc">edit</a>
</h3>
</div></div></div>
<p>Several settings affect the behavior of shard recovery when
your cluster restarts.  First, we need to understand what happens if nothing is
configured.</p>
<p>Imagine you have ten nodes, and each node holds a single shard—​either a primary
or a replica—​in a 5 primary / 1 replica index.  You take your
entire cluster offline for maintenance (installing new drives, for example).  When you
restart your cluster, it just so happens that five nodes come online before
the other five.</p>
<p>Maybe the switch to the other five is being flaky, and they didn’t
receive the restart command right away.  Whatever the reason, you have five nodes
online.  These five nodes will gossip with each other, elect a master, and form a
cluster.  They notice that data is no longer evenly distributed, since five
nodes are missing from the cluster, and immediately start replicating new
shards between each other.</p>
<p>Finally, your other five nodes turn on and join the cluster.  These nodes see
that <em>their</em> data is being replicated to other nodes, so they delete their local
data (since it is now redundant, and may be outdated).  Then the cluster starts
to rebalance even more, since the cluster size just went from five to ten.</p>
<p>During this whole process, your nodes are thrashing the disk and network, moving
data around—​for no good reason. For large clusters with terabytes of data,
this useless shuffling of data can take a <em>really long time</em>.  If all the nodes
had simply waited for the cluster to come online, all the data would have been
local and nothing would need to move.</p>
<p>Now that we know the problem, we can configure a few settings to alleviate it.
First, we need to give Elasticsearch a hard limit:</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">gateway.recover_after_nodes: 8</pre>
</div>
<p>This will prevent Elasticsearch from starting a recovery until at least eight (data or master) nodes
are present.  The value for this setting is a matter of personal preference: how
many nodes do you want present before you consider your cluster functional?
In this case, we are setting it to <code class="literal">8</code>, which means the cluster is inoperable
unless there are at least eight nodes.</p>
<p>Then we tell Elasticsearch how many nodes <em>should</em> be in the cluster, and how
long we want to wait for all those nodes:</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">gateway.expected_nodes: 10
gateway.recover_after_time: 5m</pre>
</div>
<p>What this means is that Elasticsearch will do the following:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
Wait for eight nodes to be present
</li>
<li class="listitem">
Begin recovering after 5 minutes <em>or</em> after ten nodes have joined the cluster,
whichever comes first.
</li>
</ul>
</div>
<p>These three settings allow you to avoid the excessive shard swapping that can
occur on cluster restarts.  It can literally make recovery take seconds instead
of hours.</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>These settings can only be set in the <code class="literal">config/elasticsearch.yml</code> file or on
the command line (they are not dynamically updatable) and they are only relevant
during a full cluster restart.</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="unicast"></a>Prefer Unicast over Multicast<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/510_Deployment/40_config.asciidoc">edit</a>
</h3>
</div></div></div>
<p>Elasticsearch is configured to use unicast discovery out of the box to prevent
nodes from accidentally joining a cluster. Only nodes running on the same
machine will automatically form cluster.</p>
<p>While multicast is still <a href="/guide/en/elasticsearch/plugins/current/discovery-multicast.html" class="ulink" target="_top">provided
as a plugin</a>, it should never be used in production. The
last thing you want is for nodes to accidentally join your production network, simply
because they received an errant multicast ping.  There is nothing wrong with
multicast <em>per se</em>.  Multicast simply leads to silly problems, and can be a bit
more fragile (for example, a network engineer fiddles with the network without telling
you—​and all of a sudden nodes can’t find each other anymore).</p>
<p>To use unicast, you provide Elasticsearch a list of nodes that it should try to contact.
When a node contacts a member of the unicast list, it receives a full cluster
state that lists all of the nodes in the cluster.  It then contacts
the master and joins the cluster.</p>
<p>This means your unicast list does not need to include all of the nodes in your cluster.
It just needs enough nodes that a new node can find someone to talk to.  If you
use dedicated masters, just list your three dedicated masters and call it a day.
This setting is configured in <code class="literal">elasticsearch.yml</code>:</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]</pre>
</div>
<p>For more information about how Elasticsearch nodes find each other, see
<a href="/guide/en/elasticsearch/reference/2.4/modules-discovery.html" class="ulink" target="_top">Discovery and cluster formation</a>
in the Elasticsearch Reference.</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="_configuration_management.html">« Configuration Management</a>
</span>
<span class="next">
<a href="_don_8217_t_touch_these_settings.html">Don’t Touch These Settings! »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
